package main

import (
	"bufio"
	"flag"
	"fmt"
	"net"
	"os"
	"sync"
)

func main() {
	laddr := flag.String("addr", "127.0.0.1:8080", "监听本地ip地址!")
	seler := flag.String("mode", "s", "选择服务端(s)或客户端(c)!")
	flag.Parse()
	switch *seler {
	case "c":
		client(*laddr)
	case "s":
		server(*laddr)
	default:
		fmt.Println("请选择:\n-s :服务端\n-c :客户端\n你的选择有误!")
	}

}

//net服务端
func server(addr string) {
	fmt.Println("server:服务端准备就绪！")
	ln, err := net.Listen("tcp", addr)
	if err != nil {
		fmt.Println(err)
	}
	defer ln.Close()
	for {
		conn, err := ln.Accept()
		if err != nil {
			fmt.Println(err)
		}
		//向net.conn发送数据
		go func(con *net.Conn) {
			for {
				defer (*con).Close()
				fmt.Println("等待发送数据！")
				stdinreader := bufio.NewReader(os.Stdin)
				stdindata, err := stdinreader.ReadString('\n')
				if err != nil {
					fmt.Println(err)
					break
				}
				(*con).Write([]byte(stdindata))
				fmt.Println("你输入的是：", stdindata)
				if stdindata == "exit\n" {
					return
				}
			}
		}(&conn)
		//从net.conn获取数据
		go func(con *net.Conn) {
			defer (*con).Close()
			for {
				fmt.Println("等待接收数据！")
				conreader := bufio.NewReader(*con)
				condata, err := conreader.ReadString('\n')
				if err != nil {
					fmt.Println(err)
					break
				}
				fmt.Print((*con).RemoteAddr(), "发送的数据：")
				fmt.Println(condata)
			}
		}(&conn)
	}
}

//net客户端
func client(addr string) {
	fmt.Println("client:客户端准备就绪！")
	var wg sync.WaitGroup
	conn, err := net.Dial("tcp", addr)
	if err != nil {
		fmt.Println(err)
		return
	}
	wg.Add(2)
	//向net.conn发送数据
	go func(con *net.Conn) {
		for {
			defer wg.Done()
			defer (*con).Close()
			fmt.Println("等待发送数据！")
			stdinreader := bufio.NewReader(os.Stdin)
			stdindata, err := stdinreader.ReadString('\n')
			if err != nil {
				fmt.Println(err)
				break
			}
			(*con).Write([]byte(stdindata))
			fmt.Println("你输入的是：", stdindata)
			if stdindata == "exit\n" {
				return
			}
		}
	}(&conn)
	//从net.conn获取数据
	go func(con *net.Conn) {
		defer wg.Done()
		defer (*con).Close()
		for {
			fmt.Println("等待接收数据！")
			conreader := bufio.NewReader(*con)
			condata, err := conreader.ReadString('\n')
			if err != nil {
				fmt.Println(err)
				break
			}
			fmt.Print((*con).RemoteAddr(), "发送的数据：")
			fmt.Println(condata)
		}
	}(&conn)
	wg.Wait()
}